arize-phoenix 5.2.1__py3-none-any.whl → 5.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of arize-phoenix might be problematic. Click here for more details.

Files changed (39) hide show
  1. {arize_phoenix-5.2.1.dist-info → arize_phoenix-5.3.0.dist-info}/METADATA +4 -3
  2. {arize_phoenix-5.2.1.dist-info → arize_phoenix-5.3.0.dist-info}/RECORD +37 -30
  3. phoenix/config.py +24 -0
  4. phoenix/core/model_schema_adapter.py +2 -2
  5. phoenix/db/migrations/versions/10460e46d750_datasets.py +1 -1
  6. phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +1 -1
  7. phoenix/db/migrations/versions/cf03bd6bae1d_init.py +1 -1
  8. phoenix/db/models.py +6 -6
  9. phoenix/server/api/input_types/ChatCompletionMessageInput.py +12 -0
  10. phoenix/server/api/input_types/InvocationParameters.py +20 -0
  11. phoenix/server/api/openapi/main.py +8 -13
  12. phoenix/server/api/queries.py +74 -0
  13. phoenix/server/api/schema.py +2 -0
  14. phoenix/server/api/subscriptions.py +430 -0
  15. phoenix/server/api/types/ChatCompletionMessageRole.py +11 -0
  16. phoenix/server/api/types/GenerativeModel.py +9 -0
  17. phoenix/server/api/types/GenerativeProvider.py +16 -0
  18. phoenix/server/app.py +69 -7
  19. phoenix/server/bearer_auth.py +12 -4
  20. phoenix/server/main.py +2 -2
  21. phoenix/server/static/.vite/manifest.json +31 -31
  22. phoenix/server/static/assets/{components-BqfGSfjl.js → components-DwERj42u.js} +153 -130
  23. phoenix/server/static/assets/{index-CCZJh73q.js → index-CyOjvLOr.js} +2 -2
  24. phoenix/server/static/assets/{pages-CCfzLmwR.js → pages-BNYMd7SU.js} +360 -255
  25. phoenix/server/static/assets/vendor-D-NIjePD.js +872 -0
  26. phoenix/server/static/assets/{vendor-arizeai-BCDjSYK3.js → vendor-arizeai-DoY5jUTO.js} +30 -28
  27. phoenix/server/static/assets/vendor-codemirror-CIhY_nEU.js +24 -0
  28. phoenix/server/static/assets/{vendor-recharts-CJm3CJf0.js → vendor-recharts-Dgcm35Jq.js} +1 -1
  29. phoenix/trace/fixtures.py +7 -9
  30. phoenix/utilities/client.py +2 -2
  31. phoenix/utilities/json.py +11 -0
  32. phoenix/utilities/template_formatters.py +70 -0
  33. phoenix/version.py +1 -1
  34. phoenix/server/static/assets/vendor-WKqfwbiB.js +0 -641
  35. phoenix/server/static/assets/vendor-codemirror-B_z6EOTv.js +0 -27
  36. {arize_phoenix-5.2.1.dist-info → arize_phoenix-5.3.0.dist-info}/WHEEL +0 -0
  37. {arize_phoenix-5.2.1.dist-info → arize_phoenix-5.3.0.dist-info}/entry_points.txt +0 -0
  38. {arize_phoenix-5.2.1.dist-info → arize_phoenix-5.3.0.dist-info}/licenses/IP_NOTICE +0 -0
  39. {arize_phoenix-5.2.1.dist-info → arize_phoenix-5.3.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arize-phoenix
3
- Version: 5.2.1
3
+ Version: 5.3.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://docs.arize.com/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -38,7 +38,7 @@ Requires-Dist: opentelemetry-proto>=1.12.0
38
38
  Requires-Dist: opentelemetry-sdk
39
39
  Requires-Dist: opentelemetry-semantic-conventions
40
40
  Requires-Dist: pandas>=1.0
41
- Requires-Dist: protobuf<6.0,>=3.20
41
+ Requires-Dist: protobuf<6.0,>=3.20.2
42
42
  Requires-Dist: psutil
43
43
  Requires-Dist: pyarrow
44
44
  Requires-Dist: pydantic!=2.0.*,<3,>=1.0
@@ -53,6 +53,7 @@ Requires-Dist: tqdm
53
53
  Requires-Dist: typing-extensions>=4.6
54
54
  Requires-Dist: umap-learn
55
55
  Requires-Dist: uvicorn
56
+ Requires-Dist: websockets
56
57
  Requires-Dist: wrapt
57
58
  Provides-Extra: container
58
59
  Requires-Dist: fast-hdbscan>=0.2.0; extra == 'container'
@@ -96,7 +97,7 @@ Requires-Dist: pytest-cov; extra == 'dev'
96
97
  Requires-Dist: pytest-postgresql; extra == 'dev'
97
98
  Requires-Dist: pytest-xdist; extra == 'dev'
98
99
  Requires-Dist: pytest==8.3.3; extra == 'dev'
99
- Requires-Dist: ruff==0.6.8; extra == 'dev'
100
+ Requires-Dist: ruff==0.6.9; extra == 'dev'
100
101
  Requires-Dist: strawberry-graphql[debug-server,opentelemetry]==0.243.1; extra == 'dev'
101
102
  Requires-Dist: tabulate; extra == 'dev'
102
103
  Requires-Dist: tox-uv==1.11.3; extra == 'dev'
@@ -1,17 +1,17 @@
1
1
  phoenix/__init__.py,sha256=X3eUEwd2rG8KKWWYVNNDJoqo08ihfjgHhlP29dcdNJE,5481
2
2
  phoenix/auth.py,sha256=JpkwJbis2INlIXWcQ-M_Nk5Ln9LBgHMdWNnaAQp0D2w,10940
3
- phoenix/config.py,sha256=J33eSSEMEnHGUhYhPN4c1Psoq0-7C7rloO0PiEssIsU,21703
3
+ phoenix/config.py,sha256=LApKCyQYj8qXKXPcbXK_l1uWrcaD-m_Gg9R0US05OZg,22790
4
4
  phoenix/datetime_utils.py,sha256=yDKjwX2Vtqw9h5F_ProtP-TsXidM43uIvmJ_pOzYc9A,3405
5
5
  phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
6
6
  phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
7
7
  phoenix/services.py,sha256=aTxhcOA1pZHB6U-B3TEcp6fqDF5oT0xCUvEUNMZVTUQ,5175
8
8
  phoenix/settings.py,sha256=ht-0oN-sMV6SPXrk7Tu1EZlngpAYkGNLYPhO8DyrdQI,661
9
- phoenix/version.py,sha256=Wz6OktWKdFA8wb3DR2SbK1ll5ntwA4r6J1py_6STnmA,22
9
+ phoenix/version.py,sha256=6-6zx35M00wOupvevZ13oAoDaUlHqsp_N-Ei-zUAwTI,22
10
10
  phoenix/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  phoenix/core/embedding_dimension.py,sha256=zKGbcvwOXgLf-yrJBpQyKtd-LEOPRKHnUToyAU8Owis,87
12
12
  phoenix/core/model.py,sha256=km_a--PBHOuA337ClRw9xqhOHhrUT6Rl9pz_zV0JYkQ,4843
13
13
  phoenix/core/model_schema.py,sha256=F2dbbVnkDLsPYoyZDv1q03uhvP8LcU1wXp0g-exiWs0,50551
14
- phoenix/core/model_schema_adapter.py,sha256=0Tm_Y_gV-WED8fKBCaFXAEFwE3CTEZS1dowqnTZ7x7g,8426
14
+ phoenix/core/model_schema_adapter.py,sha256=4bMkJldb-m46tH4oJRC43ytKU44rELDSwEQ9D2hqBkw,8448
15
15
  phoenix/db/README.md,sha256=Mjrq0tG68uKQ81mN1Vmu3C795EEpZndmnE6CJXsPCXE,1909
16
16
  phoenix/db/__init__.py,sha256=pDjEFXukHmJBM-1D8RjmXkvLsz85YWNxMQczt81ec3A,118
17
17
  phoenix/db/alembic.ini,sha256=GIS6HpHaKaJbbuahZg1Rc1D2_QqyCkV9r58wdARGf6w,3262
@@ -21,7 +21,7 @@ phoenix/db/enums.py,sha256=wIpN2Hwoo0A7XR1lRFjwrjZXbu2-K9hjGRXd-NYJS88,425
21
21
  phoenix/db/facilitator.py,sha256=Aulr9-sUvRn20Z7mjpWhW6TFE1amRzL8qSEjscvL-xw,4123
22
22
  phoenix/db/helpers.py,sha256=2zSc4n5IJfu-CaOFoBfqTB35M1nTFcAc8tqLsNtF2Jw,3488
23
23
  phoenix/db/migrate.py,sha256=lf6FFGzdyNjwtQ4TFi3mmHNGnnazMtG30PPB2qRF1Xc,2648
24
- phoenix/db/models.py,sha256=XY1nprYRMeeiCqBWilKRgq5RS15DuQ3_h3Qtx4jCaUI,26592
24
+ phoenix/db/models.py,sha256=zkT0sPcq3UKB24cts2e9XNpCw1TL2yUJt9nmDUAGQK8,26496
25
25
  phoenix/db/insertion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  phoenix/db/insertion/constants.py,sha256=8wifm7X-1XvroZ__R2Gc96NsgLhTDn0zXl4lehlXtcA,70
27
27
  phoenix/db/insertion/dataset.py,sha256=_vxy5e6W5jEuvO2fMKbbNCn9JvHkwI4LRKk_10eKFVg,7171
@@ -35,10 +35,10 @@ phoenix/db/insertion/types.py,sha256=4u5gvQnLQ1DE75PkWtmTp-J02m77669V9UBSibRn9P8
35
35
  phoenix/db/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  phoenix/db/migrations/env.py,sha256=tFO3ceuCx9Es5_2w_BXclaQMmNQKNX21b1UEV5mYdeo,3387
37
37
  phoenix/db/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
38
- phoenix/db/migrations/versions/10460e46d750_datasets.py,sha256=eZAyz720DmpOd7RnuxDN2dVNXVuMrdlCA7eAOxyMtfs,8695
39
- phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py,sha256=bV7urfCPkrXhkyg8oaUfLYN093UoRecLQXPkXJ8SIOs,3666
38
+ phoenix/db/migrations/versions/10460e46d750_datasets.py,sha256=3wftHgat1sEeKBl0EcQ24r_oOK_T-Tcmd2Loo73RVCs,8679
39
+ phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py,sha256=yRKdK6chzrSCGv3jEIFQeXXoCuH6bQuPg6O1SwNOLrA,3650
40
40
  phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py,sha256=fkpmh5PgMZJiZpvLbZIaqlI2cucVpVbbNYpQ-Tznil8,5180
41
- phoenix/db/migrations/versions/cf03bd6bae1d_init.py,sha256=09cpofqje8zi4eQFfUn-i21x7VcsUYOfLKKUlrtKrGc,8662
41
+ phoenix/db/migrations/versions/cf03bd6bae1d_init.py,sha256=lorqWUcujC0fsYIOriGZlZw2LKjS3nF34KHxi1fp_Z8,8646
42
42
  phoenix/experiments/__init__.py,sha256=6JGwgUd7xCbGpuHqYZlsmErmYvVgv7N_j43bn3dUqsk,123
43
43
  phoenix/experiments/functions.py,sha256=OEsBQAFZRDcrxGW21BaBIpUP3skQRzYZzAJZLQYjrJI,32478
44
44
  phoenix/experiments/tracing.py,sha256=wVpt8Ie9WNPoi1djJdcrkwCokHdTO0bicXViLg3O-1Y,2831
@@ -73,13 +73,13 @@ phoenix/pointcloud/pointcloud.py,sha256=4zAIkKs2xOUbchpj4XDAV-iPMXrfAJ15TG6rlIYG
73
73
  phoenix/pointcloud/projectors.py,sha256=TQgwc9cJDjJkin1WZyZzgl3HsYrLLiyWD7Czy4jNW3U,1088
74
74
  phoenix/pointcloud/umap_parameters.py,sha256=3UQSjrysVOvq2V4KNpTMqNqNiK0BsTZnPBHWZ4fyJtQ,1708
75
75
  phoenix/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
- phoenix/server/app.py,sha256=IilHYNvbUp-zJ9mF1HgTRS3QYkTR3MWgPu7wGe21Wcs,32063
77
- phoenix/server/bearer_auth.py,sha256=hChZ2li9qqQAuXIFtD4bp7Z60gEZhVqfCCqLeiTvD2k,5513
76
+ phoenix/server/app.py,sha256=yfK6jXMFpFO2F06GngSHbsILw2JFRiAcqBLNWCS9Pv4,35084
77
+ phoenix/server/bearer_auth.py,sha256=zhXu-IXJD5WslknHgrITf7HdOiv09DFhcl3Qp5C0sJo,5916
78
78
  phoenix/server/dml_event.py,sha256=MpjCFqljxvgb9OB5Cez9vJesb3oHb3XxXictynBfcis,2851
79
79
  phoenix/server/dml_event_handler.py,sha256=yU23-DDwXcL35p5EPwFW0oZh6mxQxJrJAQPKcYZYJz4,8310
80
80
  phoenix/server/grpc_server.py,sha256=nqeHg0FxGppjy8MqQUQ8DJtY4bkvJkR3tCxxmXGk6n0,3733
81
81
  phoenix/server/jwt_store.py,sha256=lmcTRBPoxMHzSV7WT8Ew40ag4uxeMWPLDw-vPIoWL8s,16829
82
- phoenix/server/main.py,sha256=T_W34ZpBdZDTv5qZMPOfwvz5Nc2QtxUov_sFKNDUneg,15759
82
+ phoenix/server/main.py,sha256=d6I67MWrI38z9M5OEJfL5OB8dgCtkgIpspnmlVPveMk,15770
83
83
  phoenix/server/oauth2.py,sha256=4zt6NEh0o2a3HUThYs-FPqOeDcvYM3YKKMg-s_Awls0,2043
84
84
  phoenix/server/prometheus.py,sha256=x9zV3M8VeZ9GS32SLr5OxNdi1VaxvdHCZPx2zI8Hoa4,3549
85
85
  phoenix/server/rate_limiters.py,sha256=7UJDH9YTmBIeGFLJX1759-LpS-XNp0zN1TlzxyqTnZc,7163
@@ -92,8 +92,9 @@ phoenix/server/api/auth.py,sha256=OhWmv_Hl-K-yhJeUWXKRYYiUOIPo-rYSQXdm4fjeTJ8,90
92
92
  phoenix/server/api/context.py,sha256=g5tAYInMifMOdnGTlyfHdB7rDNlC9F2E5bU6IA_3Y0c,5337
93
93
  phoenix/server/api/exceptions.py,sha256=TA0JuY2YRnj35qGuMSQ8d0ToHum9gWm9W--3fSKHrX0,1171
94
94
  phoenix/server/api/interceptor.py,sha256=ykDnoC_apUd-llVli3m1CW18kNSIgjz2qZ6m5JmPDu8,1294
95
- phoenix/server/api/queries.py,sha256=u_4VFwwIfg7EcHiMCcSM9ZUQeGxkIQzxGLi1HowTQOQ,24732
96
- phoenix/server/api/schema.py,sha256=4L2m6QXhaV13YPTZCEZ3hqCPQFHZOy3QnJVLRYQFzpg,548
95
+ phoenix/server/api/queries.py,sha256=sE_w4X9sz0QJBGNQbOMgiZiKpR24jvxCpv6AQeGeE9Y,27153
96
+ phoenix/server/api/schema.py,sha256=JKxcZd0UBX6VnVic9tnKAzehJ2fGYNWAu6Gr1tR1PMI,637
97
+ phoenix/server/api/subscriptions.py,sha256=Ck2IrFcHaqipeHY68up4fXMHcfgjh6J5s9XbDVQxJBA,15934
97
98
  phoenix/server/api/utils.py,sha256=Kl47G-1A7QKTDrc75BU2QK6HupsG6MWuXxy351FOfKQ,858
98
99
  phoenix/server/api/dataloaders/__init__.py,sha256=jNYvfXjnZzgA2HWTG7AZdqWGla3ZysBUDUei8Zkz6N8,3290
99
100
  phoenix/server/api/dataloaders/annotation_summaries.py,sha256=Wv8AORZoGd5TJ4Y-em8iqJu87AMpZP7lWOTr-SML-x8,5560
@@ -126,6 +127,7 @@ phoenix/server/api/helpers/__init__.py,sha256=_V1eVkchZmTkhOfRC4QqR1sUB2xtIxdsMJ
126
127
  phoenix/server/api/helpers/dataset_helpers.py,sha256=A6UzEyAb4gFtyc_AV63_yl9OpN0vn8Vw1BBCTNjg9J0,6875
127
128
  phoenix/server/api/input_types/AddExamplesToDatasetInput.py,sha256=ZGXMV0H3DYHi4DdqGhejDzaWdFinyem1Mc8DVA7iCh0,436
128
129
  phoenix/server/api/input_types/AddSpansToDatasetInput.py,sha256=C4oZ0WqYqca1kleNOCMIM2_aY6Qnc5n1xXG51_C1V0w,368
130
+ phoenix/server/api/input_types/ChatCompletionMessageInput.py,sha256=tzRwo9gth1ZkZULM_w3OE9txt_sW2PEBfrzx0pVyjEQ,362
129
131
  phoenix/server/api/input_types/ClearProjectInput.py,sha256=cpPFRyQ3ffy2dLbCZgYpway-mCzhdm4QqnUg8caOBfQ,382
130
132
  phoenix/server/api/input_types/ClusterInput.py,sha256=EL4ftvZxQ8mVdruUPcdhMhByORmSmM8S-X6RPqU6GX0,179
131
133
  phoenix/server/api/input_types/Coordinates.py,sha256=meTwbIjwTfqx5DGD2DBlH9wQzdQVNM5a8x9dp1FfIgA,173
@@ -143,6 +145,7 @@ phoenix/server/api/input_types/DeleteExperimentsInput.py,sha256=yUbwMckIBvIL-R9t
143
145
  phoenix/server/api/input_types/DimensionFilter.py,sha256=vcXgglSnZcB5pGh-6oEtRmGx95hISgFUR7BEPw01g7U,3143
144
146
  phoenix/server/api/input_types/DimensionInput.py,sha256=Vfx5FmiMKey4-EHDQsQRPzSAMRJMN5oVMLDUl4NKAa8,164
145
147
  phoenix/server/api/input_types/Granularity.py,sha256=6SVfZ5yTZYq1PI6vdpjfkBUc4YilLSkF-k6okuSNbbQ,2301
148
+ phoenix/server/api/input_types/InvocationParameters.py,sha256=Zz4Cd2BwriPxouBzsGIfQrvIasJGHHthyGFkjzGa0Dw,528
146
149
  phoenix/server/api/input_types/PatchAnnotationInput.py,sha256=NWhkcbcGNPwfOYsN3wm5YFNNrSc5T-8Y5my74RK99HE,520
147
150
  phoenix/server/api/input_types/PatchDatasetExamplesInput.py,sha256=E86aBGXDBC83jiEGwV5rilnoeQf6eqCfZ0aAVeIt2VI,890
148
151
  phoenix/server/api/input_types/PatchDatasetInput.py,sha256=OURtTVY8Z_oFEDtKwT1LCMaOK5D4QYo5TVQ6mDrex-g,328
@@ -163,7 +166,7 @@ phoenix/server/api/mutations/span_annotations_mutations.py,sha256=HwXB_C0y9tK-ae
163
166
  phoenix/server/api/mutations/trace_annotations_mutations.py,sha256=wZTotf4mWadMVIzr1Drv9vbntPsx7UUIeX7Q5drjc8I,5912
164
167
  phoenix/server/api/mutations/user_mutations.py,sha256=32Fcuxn6GWwY2cl3OTYTQIyBANl23UF6wqxeaa3JrmE,13324
165
168
  phoenix/server/api/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
- phoenix/server/api/openapi/main.py,sha256=KNutA_7AvV_WlGX8cOkvvDujcJKQ7AD1HT6rTpCpR8A,616
169
+ phoenix/server/api/openapi/main.py,sha256=yKdzJYI4cxy_1mFcK4_7YObIcuRviBIfwNjB23RG14k,461
167
170
  phoenix/server/api/openapi/schema.py,sha256=LJ3dRElQP2nXN-HaxOysiiQrvn5PxjuaLYT7q5jUjb8,490
168
171
  phoenix/server/api/routers/__init__.py,sha256=YIzHsIFOOXuCRbDkMUHx-McrANFJK5UfUn6a4BNIzmo,277
169
172
  phoenix/server/api/routers/auth.py,sha256=T774FE5mqrfRSSYo1snpR5NIp3YzAJnsLsY9FJB9GCA,11164
@@ -185,6 +188,7 @@ phoenix/server/api/types/AnnotationSummary.py,sha256=8B2LIROqcrPOi8hvYygsblKvSEB
185
188
  phoenix/server/api/types/AnnotatorKind.py,sha256=rPgGdbN1Gvc109sGQ_ZH-gfJbp93V9wlarzTEJNtUwI,236
186
189
  phoenix/server/api/types/ApiKey.py,sha256=76HIkWxyJqL3UjdMesX9l5y6XaD9QphwabXGQVY-MaQ,793
187
190
  phoenix/server/api/types/AuthMethod.py,sha256=M25usT6FCNKi-QFMdtMqRjJVGfq1ACnVoSjHXGxfrUk,126
191
+ phoenix/server/api/types/ChatCompletionMessageRole.py,sha256=kmQOilOlVntlmqbaHkqXZuimfljfYaHc3kbo53uK8_0,227
188
192
  phoenix/server/api/types/Cluster.py,sha256=ac4YfT1OH3xLVmex7EUmB6b9IpULnhLTt554LR0jglE,5689
189
193
  phoenix/server/api/types/CreateDatasetPayload.py,sha256=R-6zCmuD0f76RU9Giu78xwTHlASQs6Aq8yzvX1Kxc3g,140
190
194
  phoenix/server/api/types/DataQualityMetric.py,sha256=zRKsNvHBu-NdcsunuLhqFpZhi6ks-HMqA1PJD27jTak,590
@@ -214,6 +218,8 @@ phoenix/server/api/types/ExperimentRun.py,sha256=LkR7fBRZ3nH57ZoHJwePTGtJYcTMM-E
214
218
  phoenix/server/api/types/ExperimentRunAnnotation.py,sha256=iBxDaD9DgiF-Qymp5QyxWfJRGYXM1_CeWA_qzsZBqkI,1812
215
219
  phoenix/server/api/types/ExportedFile.py,sha256=e3GTn7B5LgsTbqiwjhMCQH7VsiqXitrBO4aCMS1lHsg,163
216
220
  phoenix/server/api/types/Functionality.py,sha256=tzV9xdhB8zqfsjWxP66NDC7EZsplYkYO7jRbLWJIeeg,382
221
+ phoenix/server/api/types/GenerativeModel.py,sha256=P7eBUMXbeqaLwSSGBKdZy3a5gOLd9I0fuP8o1st6H08,193
222
+ phoenix/server/api/types/GenerativeProvider.py,sha256=FYsx_2tUV2esmconK455yCYFzdHbXVHQJv6PKMXH4d4,269
217
223
  phoenix/server/api/types/Inferences.py,sha256=BOMlOSsRtUV9XQxpnjmZxdBcJ1w-t9PiFfVOSTS160E,3367
218
224
  phoenix/server/api/types/InferencesRole.py,sha256=Kj9aiXOpGhpeg9PHd9MDU7aXVIT28EjJxr4P6xybfzc,601
219
225
  phoenix/server/api/types/LabelFraction.py,sha256=zsDxdFALrNiGA1eNykeP8o65gbA0HOhRp54MPH_iRAM,93
@@ -258,15 +264,15 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
258
264
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
259
265
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
260
266
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
261
- phoenix/server/static/.vite/manifest.json,sha256=mkY5ird4Wof-mDOPIJlwDha9L2k0ENmpK0fkZkNdD0A,1929
262
- phoenix/server/static/assets/components-BqfGSfjl.js,sha256=fNPFgXJevgHCyopW0XhaMMQ22jS9UxrZ5dFpoEwaXMA,260281
263
- phoenix/server/static/assets/index-CCZJh73q.js,sha256=OoTG9Ti8uY09XtXatm8VZVcLb9CP_XHe-IdVFTrnmEE,6947
264
- phoenix/server/static/assets/pages-CCfzLmwR.js,sha256=0ojEBdpP1Lwsa4D9Zn27VjppB6cy-Pvrk4fri4WgTdc,558077
267
+ phoenix/server/static/.vite/manifest.json,sha256=U6-H3n01tSVeVy-l94OEK3EruoVfOa9qX_vwKmkgetU,1929
268
+ phoenix/server/static/assets/components-DwERj42u.js,sha256=_UuYjCrj_FQcxrE9bS2L5OdRWjHRYSpaeqlyKz1uGEI,272882
269
+ phoenix/server/static/assets/index-CyOjvLOr.js,sha256=F-_8kYJi1I6xjcpaGnZnv9GBXlbmcd9BbyKRNe8TOzI,7162
270
+ phoenix/server/static/assets/pages-BNYMd7SU.js,sha256=dT3K-yhvV7kZtBmut5iiNTCbO_LvaMDKD27XCJm95oc,585995
271
+ phoenix/server/static/assets/vendor-D-NIjePD.js,sha256=tba6ip4z7SOnhlPkBkyt9CUJiDDzZwi6IRKCnbwHvuA,10898294
265
272
  phoenix/server/static/assets/vendor-DxkFTwjz.css,sha256=nZrkr0u6NNElFGvpWHk9GTHeGoibCXCli1bE7mXZGZg,1816
266
- phoenix/server/static/assets/vendor-WKqfwbiB.js,sha256=MIOAdw-FiFVinsIY9ZVP7iz1ia4QF-IgNG0a07keTOI,1435307
267
- phoenix/server/static/assets/vendor-arizeai-BCDjSYK3.js,sha256=f2UQk7r2Dr6VMQDf0uHultWQedME5GdbBnNzQTJxvJw,304401
268
- phoenix/server/static/assets/vendor-codemirror-B_z6EOTv.js,sha256=-YpeYvPK_xWRa8C-tWQqGQwIJNOxYqaKPcRiNFB_Nc8,516470
269
- phoenix/server/static/assets/vendor-recharts-CJm3CJf0.js,sha256=kc9kNfFktozfoXUIYfaD2ABKbV0EtdInsXUBohzh9qo,282859
273
+ phoenix/server/static/assets/vendor-arizeai-DoY5jUTO.js,sha256=RkuJgULcP6CtTAhyLSzI9bNRiJnq84MwkYCF6MQ2sCw,306507
274
+ phoenix/server/static/assets/vendor-codemirror-CIhY_nEU.js,sha256=6g23qgUXzCj6VuoJC9Uhq7Y9qb3_WN3u767NLDhfGkM,392703
275
+ phoenix/server/static/assets/vendor-recharts-Dgcm35Jq.js,sha256=9ifuAYGnEKtBtbTV9sFe95rP4e1NR9j8DOVEb-hRKzM,282859
270
276
  phoenix/server/static/assets/vendor-three-DwGkEfCM.js,sha256=0D12ZgKzfKCTSdSTKJBFR2RZO_xxeMXrqDp0AszZqHY,620972
271
277
  phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
272
278
  phoenix/server/templates/index.html,sha256=ULNlp0-agU8pH4wCIapE1goqnwkbctAoQRgrfwH_irg,4379
@@ -280,7 +286,7 @@ phoenix/trace/attributes.py,sha256=B_OrzVaxZwFkrAFXZyicYoIti1UdUysURsvUS2GyW1U,1
280
286
  phoenix/trace/errors.py,sha256=wB1z8qdPckngdfU-TORToekvg3344oNFAA83_hC2yFY,180
281
287
  phoenix/trace/evaluation_conventions.py,sha256=t8jydM3U0-T5YpiQKRJ3tWdWGlHtzKyttYdw-ddvPOk,1048
282
288
  phoenix/trace/exporter.py,sha256=bUXh8fjJIbHurrnt4bAm-cCWqUN5FqNsIc8DZzzklkQ,4695
283
- phoenix/trace/fixtures.py,sha256=nfVbYYCNNO6HX5SRZHPxcy6tZZkC8xc3FbvvMLfsDhA,19005
289
+ phoenix/trace/fixtures.py,sha256=qKYXz33MD7FYkSni7ccyFjXMV5iub7serp1zMGqh1P8,18982
284
290
  phoenix/trace/otel.py,sha256=c3Iy9sUTYBliwYfChZIQ9_6xTti1BijY7t_4s2tqbyw,10028
285
291
  phoenix/trace/projects.py,sha256=2BwlNjFE-uwpqYtCu5YyBiYZk9wRPpM13vh3-Cv7GkA,2157
286
292
  phoenix/trace/schemas.py,sha256=HpWSyzec0yDHEQXEDuwyLbhpvKrqkGps8BJqGiIFj8Y,5978
@@ -298,17 +304,18 @@ phoenix/trace/v1/__init__.py,sha256=-IbAD0ruESMjvQLvGAg9CTfjBUATFDx1OXseDPis6-0,
298
304
  phoenix/trace/v1/evaluation_pb2.py,sha256=8sXvv2BW_vqD30MOMbmkeE2zpmm7ncik21kl3e-HzeQ,2254
299
305
  phoenix/trace/v1/evaluation_pb2.pyi,sha256=cCbbx06gwQmaH14s3J1X25TtaARh-k1abbxQdQCXGm8,4500
300
306
  phoenix/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
301
- phoenix/utilities/client.py,sha256=2SjLAPC6monor6GxQltzNAmlTdHouiodq0-zpwCXWNY,5589
307
+ phoenix/utilities/client.py,sha256=kr95EgpTJtCbb7CLoxC-KiyB2Wco03DZGIlcEmozHFs,5605
302
308
  phoenix/utilities/deprecation.py,sha256=cFuTVvjSYyRlrdxdJewjJVieIEHPk30BukSRGRydQ3k,1046
303
309
  phoenix/utilities/error_handling.py,sha256=7b5rpGFj9EWZ8yrZK1IHvxB89suWk3lggDayUQcvZds,1946
304
- phoenix/utilities/json.py,sha256=y_w-McDfvlTeGJT28sCtyjzVkwFicakxERG-sGRc8Ak,1948
310
+ phoenix/utilities/json.py,sha256=-_LkuoipOMNlC-PWInFez9mMZkAK8fr3Z8bv6ri6la8,2361
305
311
  phoenix/utilities/logging.py,sha256=B8t2WPULOwVyuGLRLbwKsw5N41N26vtgF-lCAYgWTEk,508
306
312
  phoenix/utilities/project.py,sha256=8IJuMM4yUMoooPi37sictGj8Etu9rGmq6RFtc9848cQ,436
307
313
  phoenix/utilities/re.py,sha256=nr_B0txj_7CXc45953X6vr2KCRSWMuaXJSEkL8s8Sjc,2036
308
314
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
309
- arize_phoenix-5.2.1.dist-info/METADATA,sha256=u6OS3E1sGwz43S57i8igODxTq1RTqD3qkeEd988AlAY,11973
310
- arize_phoenix-5.2.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
311
- arize_phoenix-5.2.1.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
312
- arize_phoenix-5.2.1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
313
- arize_phoenix-5.2.1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
314
- arize_phoenix-5.2.1.dist-info/RECORD,,
315
+ phoenix/utilities/template_formatters.py,sha256=zWY6gjAMmspYqlmn-ZjKeY5SExylwePk7a1BUdDxVGI,2236
316
+ arize_phoenix-5.3.0.dist-info/METADATA,sha256=dUAQVYFPQEpsSlvr7nWc3ggbxJ8D9M4DQCEdAI7Y3Wo,12001
317
+ arize_phoenix-5.3.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
318
+ arize_phoenix-5.3.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
319
+ arize_phoenix-5.3.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
320
+ arize_phoenix-5.3.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
321
+ arize_phoenix-5.3.0.dist-info/RECORD,,
phoenix/config.py CHANGED
@@ -107,6 +107,14 @@ ENV_PHOENIX_PASSWORD_RESET_TOKEN_EXPIRY_MINUTES = "PHOENIX_PASSWORD_RESET_TOKEN_
107
107
  """
108
108
  The duration, in minutes, before password reset tokens expire.
109
109
  """
110
+ ENV_PHOENIX_CSRF_TRUSTED_ORIGINS = "PHOENIX_CSRF_TRUSTED_ORIGINS"
111
+ """
112
+ A comma-separated list of origins allowed to bypass Cross-Site Request Forgery (CSRF)
113
+ protection. This setting is recommended when configuring OAuth2 clients or sending
114
+ password reset emails. If this variable is left unspecified or contains no origins, CSRF
115
+ protection will not be enabled. In such cases, when a request includes `origin` or `referer`
116
+ headers, those values will not be validated.
117
+ """
110
118
 
111
119
  # SMTP settings
112
120
  ENV_PHOENIX_SMTP_HOSTNAME = "PHOENIX_SMTP_HOSTNAME"
@@ -321,6 +329,22 @@ def get_env_refresh_token_expiry() -> timedelta:
321
329
  return timedelta(minutes=minutes)
322
330
 
323
331
 
332
+ def get_env_csrf_trusted_origins() -> List[str]:
333
+ origins: List[str] = []
334
+ if not (csrf_trusted_origins := os.getenv(ENV_PHOENIX_CSRF_TRUSTED_ORIGINS)):
335
+ return origins
336
+ for origin in csrf_trusted_origins.split(","):
337
+ if not origin:
338
+ continue
339
+ if not urlparse(origin).hostname:
340
+ raise ValueError(
341
+ f"The environment variable `{ENV_PHOENIX_CSRF_TRUSTED_ORIGINS}` contains a url "
342
+ f"with missing hostname. Please ensure that each url has a valid hostname."
343
+ )
344
+ origins.append(origin)
345
+ return sorted(set(origins))
346
+
347
+
324
348
  def get_env_smtp_username() -> str:
325
349
  return os.getenv(ENV_PHOENIX_SMTP_USERNAME) or ""
326
350
 
@@ -6,10 +6,10 @@ import pandas as pd
6
6
  from pandas.api.types import is_object_dtype
7
7
  from typing_extensions import TypeAlias, TypeGuard
8
8
 
9
- from phoenix import EmbeddingColumnNames, Inferences
10
9
  from phoenix.core.model import _get_embedding_dimensions
11
10
  from phoenix.core.model_schema import Embedding, Model, RetrievalEmbedding, Schema
12
- from phoenix.inferences.schema import RetrievalEmbeddingColumnNames
11
+ from phoenix.inferences.inferences import Inferences
12
+ from phoenix.inferences.schema import EmbeddingColumnNames, RetrievalEmbeddingColumnNames
13
13
  from phoenix.inferences.schema import Schema as InferencesSchema
14
14
 
15
15
  InferencesName: TypeAlias = str
@@ -20,7 +20,7 @@ class JSONB(JSON):
20
20
  __visit_name__ = "JSONB"
21
21
 
22
22
 
23
- @compiles(JSONB, "sqlite") # type: ignore
23
+ @compiles(JSONB, "sqlite")
24
24
  def _(*args: Any, **kwargs: Any) -> str:
25
25
  # See https://docs.sqlalchemy.org/en/20/core/custom_types.html
26
26
  return "JSONB"
@@ -32,7 +32,7 @@ class JSONB(JSON):
32
32
  __visit_name__ = "JSONB"
33
33
 
34
34
 
35
- @compiles(JSONB, "sqlite") # type: ignore
35
+ @compiles(JSONB, "sqlite")
36
36
  def _(*args: Any, **kwargs: Any) -> str:
37
37
  # See https://docs.sqlalchemy.org/en/20/core/custom_types.html
38
38
  return "JSONB"
@@ -20,7 +20,7 @@ class JSONB(JSON):
20
20
  __visit_name__ = "JSONB"
21
21
 
22
22
 
23
- @compiles(JSONB, "sqlite") # type: ignore
23
+ @compiles(JSONB, "sqlite")
24
24
  def _(*args: Any, **kwargs: Any) -> str:
25
25
  # See https://docs.sqlalchemy.org/en/20/core/custom_types.html
26
26
  return "JSONB"
phoenix/db/models.py CHANGED
@@ -50,7 +50,7 @@ class JSONB(JSON):
50
50
  __visit_name__ = "JSONB"
51
51
 
52
52
 
53
- @compiles(JSONB, "sqlite") # type: ignore
53
+ @compiles(JSONB, "sqlite")
54
54
  def _(*args: Any, **kwargs: Any) -> str:
55
55
  # See https://docs.sqlalchemy.org/en/20/core/custom_types.html
56
56
  return "JSONB"
@@ -271,7 +271,7 @@ class LatencyMs(expression.FunctionElement[float]):
271
271
  name = "latency_ms"
272
272
 
273
273
 
274
- @compiles(LatencyMs) # type: ignore
274
+ @compiles(LatencyMs)
275
275
  def _(element: Any, compiler: Any, **kw: Any) -> Any:
276
276
  # See https://docs.sqlalchemy.org/en/20/core/compiler.html
277
277
  start_time, end_time = list(element.clauses)
@@ -287,7 +287,7 @@ def _(element: Any, compiler: Any, **kw: Any) -> Any:
287
287
  )
288
288
 
289
289
 
290
- @compiles(LatencyMs, "sqlite") # type: ignore
290
+ @compiles(LatencyMs, "sqlite")
291
291
  def _(element: Any, compiler: Any, **kw: Any) -> Any:
292
292
  # See https://docs.sqlalchemy.org/en/20/core/compiler.html
293
293
  start_time, end_time = list(element.clauses)
@@ -308,21 +308,21 @@ class TextContains(expression.FunctionElement[str]):
308
308
  name = "text_contains"
309
309
 
310
310
 
311
- @compiles(TextContains) # type: ignore
311
+ @compiles(TextContains)
312
312
  def _(element: Any, compiler: Any, **kw: Any) -> Any:
313
313
  # See https://docs.sqlalchemy.org/en/20/core/compiler.html
314
314
  string, substring = list(element.clauses)
315
315
  return compiler.process(string.contains(substring), **kw)
316
316
 
317
317
 
318
- @compiles(TextContains, "postgresql") # type: ignore
318
+ @compiles(TextContains, "postgresql")
319
319
  def _(element: Any, compiler: Any, **kw: Any) -> Any:
320
320
  # See https://docs.sqlalchemy.org/en/20/core/compiler.html
321
321
  string, substring = list(element.clauses)
322
322
  return compiler.process(func.strpos(string, substring) > 0, **kw)
323
323
 
324
324
 
325
- @compiles(TextContains, "sqlite") # type: ignore
325
+ @compiles(TextContains, "sqlite")
326
326
  def _(element: Any, compiler: Any, **kw: Any) -> Any:
327
327
  # See https://docs.sqlalchemy.org/en/20/core/compiler.html
328
328
  string, substring = list(element.clauses)
@@ -0,0 +1,12 @@
1
+ import strawberry
2
+ from strawberry.scalars import JSON
3
+
4
+ from phoenix.server.api.types.ChatCompletionMessageRole import ChatCompletionMessageRole
5
+
6
+
7
+ @strawberry.input
8
+ class ChatCompletionMessageInput:
9
+ role: ChatCompletionMessageRole
10
+ content: JSON = strawberry.field(
11
+ description="The content of the message as JSON to support text and tools",
12
+ )
@@ -0,0 +1,20 @@
1
+ from typing import List, Optional
2
+
3
+ import strawberry
4
+ from strawberry import UNSET
5
+ from strawberry.scalars import JSON
6
+
7
+
8
+ @strawberry.input
9
+ class InvocationParameters:
10
+ """
11
+ Invocation parameters interface shared between different providers.
12
+ """
13
+
14
+ temperature: Optional[float] = UNSET
15
+ max_completion_tokens: Optional[int] = UNSET
16
+ max_tokens: Optional[int] = UNSET
17
+ top_p: Optional[float] = UNSET
18
+ stop: Optional[List[str]] = UNSET
19
+ seed: Optional[int] = UNSET
20
+ tool_choice: Optional[JSON] = UNSET
@@ -1,22 +1,17 @@
1
1
  import json
2
2
  from argparse import ArgumentParser
3
- from typing import Optional, Tuple
4
3
 
5
- from .schema import get_openapi_schema
4
+ from phoenix.server.api.openapi.schema import get_openapi_schema
6
5
 
7
6
  if __name__ == "__main__":
8
7
  parser = ArgumentParser()
9
8
  parser.add_argument(
10
- "--compress",
11
- action="store_true",
12
- help="Whether to output a compressed version of the OpenAPI schema",
9
+ "-o",
10
+ "--output",
11
+ type=str,
12
+ required=True,
13
+ help="Path to the output file (e.g., openapi.json)",
13
14
  )
14
15
  args = parser.parse_args()
15
-
16
- indent: Optional[int] = None
17
- separator: Optional[Tuple[str, str]] = None
18
- if args.compress:
19
- separator = (",", ":")
20
- else:
21
- indent = 2
22
- print(json.dumps(get_openapi_schema(), indent=indent, separators=separator))
16
+ with open(args.output, "w") as f:
17
+ json.dump(get_openapi_schema(), f, indent=2)
@@ -58,6 +58,11 @@ from phoenix.server.api.types.Experiment import Experiment
58
58
  from phoenix.server.api.types.ExperimentComparison import ExperimentComparison, RunComparisonItem
59
59
  from phoenix.server.api.types.ExperimentRun import ExperimentRun, to_gql_experiment_run
60
60
  from phoenix.server.api.types.Functionality import Functionality
61
+ from phoenix.server.api.types.GenerativeModel import GenerativeModel
62
+ from phoenix.server.api.types.GenerativeProvider import (
63
+ GenerativeProvider,
64
+ GenerativeProviderKey,
65
+ )
61
66
  from phoenix.server.api.types.InferencesRole import AncillaryInferencesRole, InferencesRole
62
67
  from phoenix.server.api.types.Model import Model
63
68
  from phoenix.server.api.types.node import from_global_id, from_global_id_with_expected_type
@@ -76,8 +81,77 @@ from phoenix.server.api.types.UserApiKey import UserApiKey, to_gql_api_key
76
81
  from phoenix.server.api.types.UserRole import UserRole
77
82
 
78
83
 
84
+ @strawberry.input
85
+ class ModelsInput:
86
+ provider_key: Optional[GenerativeProviderKey]
87
+
88
+
79
89
  @strawberry.type
80
90
  class Query:
91
+ @strawberry.field
92
+ async def model_providers(self) -> List[GenerativeProvider]:
93
+ return [
94
+ GenerativeProvider(
95
+ name="OpenAI",
96
+ key=GenerativeProviderKey.OPENAI,
97
+ ),
98
+ GenerativeProvider(
99
+ name="Azure OpenAI",
100
+ key=GenerativeProviderKey.AZURE_OPENAI,
101
+ ),
102
+ GenerativeProvider(
103
+ name="Anthropic",
104
+ key=GenerativeProviderKey.ANTHROPIC,
105
+ ),
106
+ ]
107
+
108
+ @strawberry.field
109
+ async def models(self, input: Optional[ModelsInput] = None) -> List[GenerativeModel]:
110
+ openai_models = [
111
+ "o1-preview",
112
+ "o1-preview-2024-09-12",
113
+ "o1-mini",
114
+ "o1-mini-2024-09-12",
115
+ "gpt-4o",
116
+ "gpt-4o-2024-08-06",
117
+ "gpt-4o-2024-05-13",
118
+ "chatgpt-4o-latest",
119
+ "gpt-4o-mini",
120
+ "gpt-4o-mini-2024-07-18",
121
+ "gpt-4-turbo",
122
+ "gpt-4-turbo-2024-04-09",
123
+ "gpt-4-turbo-preview",
124
+ "gpt-4-0125-preview",
125
+ "gpt-4-1106-preview",
126
+ "gpt-4",
127
+ "gpt-4-0613",
128
+ "gpt-3.5-turbo-0125",
129
+ "gpt-3.5-turbo",
130
+ "gpt-3.5-turbo-1106",
131
+ "gpt-3.5-turbo-instruct",
132
+ ]
133
+ anthropic_models = [
134
+ "claude-3-5-sonnet-20240620",
135
+ "claude-3-opus-20240229",
136
+ "claude-3-sonnet-20240229",
137
+ "claude-3-haiku-20240307",
138
+ ]
139
+ openai_generative_models = [
140
+ GenerativeModel(name=model_name, provider_key=GenerativeProviderKey.OPENAI)
141
+ for model_name in openai_models
142
+ ]
143
+ anthropic_generative_models = [
144
+ GenerativeModel(name=model_name, provider_key=GenerativeProviderKey.ANTHROPIC)
145
+ for model_name in anthropic_models
146
+ ]
147
+
148
+ all_models = openai_generative_models + anthropic_generative_models
149
+
150
+ if input is not None and input.provider_key is not None:
151
+ return [model for model in all_models if model.provider_key == input.provider_key]
152
+
153
+ return all_models
154
+
81
155
  @strawberry.field(permission_classes=[IsAdmin]) # type: ignore
82
156
  async def users(
83
157
  self,
@@ -3,6 +3,7 @@ import strawberry
3
3
  from phoenix.server.api.exceptions import get_mask_errors_extension
4
4
  from phoenix.server.api.mutations import Mutation
5
5
  from phoenix.server.api.queries import Query
6
+ from phoenix.server.api.subscriptions import Subscription
6
7
 
7
8
  # This is the schema for generating `schema.graphql`.
8
9
  # See https://strawberry.rocks/docs/guides/schema-export
@@ -12,4 +13,5 @@ schema = strawberry.Schema(
12
13
  query=Query,
13
14
  mutation=Mutation,
14
15
  extensions=[get_mask_errors_extension()],
16
+ subscription=Subscription,
15
17
  )